#include "commonpage.h"
#include "listitembox.h"
#include "music.h"
#include "ui_commonpage.h"
#include <qcontainerfwd.h>
#include <QListWidgetItem>

commonPage::commonPage(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::commonPage)
{
    ui->setupUi(this);
    ui->pageMusicList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    connect(ui->playAllBtn, &QPushButton::clicked, this, [=]() {
        emit playAll(page_typy_);
    });
    connect(ui->pageMusicList, &QListWidget::doubleClicked, this, [=](const QModelIndex &index) {
        emit playMusicByIndex(this, index.row());
    });
}
/**
 * @brief 设置通用页面的UI元素
 * @param text 页面标题文本
 * @param imagePath 背景图片路径
 * @details 该函数用于设置通用页面的标题和背景图片，
 *          通过修改页面UI元素来展示指定的文本和图片。
 *          同时设置了图片标签的缩放属性以适应显示区域。
 * @note 此函数是const成员函数，不会修改对象状态
 */
void commonPage::setCommonPageUi(const QString &text, const QString &imagePath) const
{
    // 设置页面标题文本
    ui->pageTitle->setText(text);

    // 设置页面背景图片并启用内容缩放
    ui->musicImageLabel->setPixmap(QPixmap(imagePath));
    ui->musicImageLabel->setScaledContents(true);

    // listItemBox* list_item_box = new listItemBox(this);
    // QListWidgetItem* item = new QListWidgetItem(ui->pageMusicList);
    // item->setSizeHint(QSize(list_item_box->width(), list_item_box->height()));
    // ui->pageMusicList->setItemWidget(item, list_item_box);
}
/**
 * @brief 设置音乐列表类型
 * @param page_type 页面类型枚举值
 * @details 该函数用于设置当前页面的音乐列表类型，
 *          不同的类型会影响页面的行为和显示内容。
 *          页面类型包括喜欢页面、本地页面和历史页面。
 */
void commonPage::setMusicListType(const pageType page_type)
{
    this->page_typy_ = page_type;
}
/**
 * @brief 向音乐页面添加音乐列表
 * @param music_list 音乐列表引用
 * @details 该函数根据页面类型筛选音乐列表中的音乐，
 *          并将符合条件的音乐ID添加到页面音乐列表中：
 *          - LIKE_PAGE: 只添加标记为喜欢的音乐
 *          - LOCAL_PAGE: 添加所有音乐
 *          - HISTORY_PAGE: 只添加历史播放过的音乐
 * @note 此函数会先清空现有的页面音乐列表
 */
void commonPage::addMusicToMusicPage(musicList &music_list)
{
    // 清空页面音乐列表并根据页面类型重新添加音乐
    music_of_page_.clear();
    // 遍历音乐列表，根据页面类型筛选音乐
    for (auto &music : music_list)
    {
        switch (page_typy_)
        {
        case LIKE_PAGE:
            // 喜欢页面只添加标记为喜欢的音乐
            if (music.getIsLike())
                music_of_page_.push_back(music.getMusicId());
            break;
        case LOCAL_PAGE:
            // 本地页面添加所有音乐
            music_of_page_.push_back(music.getMusicId());
            break;
        case HISTORY_PAGE:
            // 历史页面只添加历史播放过的音乐
            if (music.getIsHistory())
                music_of_page_.push_back(music.getMusicId());
            break;
        default:
            Debug << "暂未支持";
        }
    }
}
/**
 * @brief 刷新页面显示内容
 * @param music_list 音乐列表引用
 * @details 该函数根据提供的音乐列表刷新页面的显示内容，
 *          执行以下操作：
 *          1. 清空当前页面音乐列表显示
 *          2. 根据页面类型重新筛选音乐
 *          3. 为每个音乐创建列表项并设置相关信息
 *          4. 连接信号槽以处理音乐喜欢状态的更新
 *          5. 立即重绘窗口以更新显示
 */
void commonPage::reFresh(musicList &music_list)
{
    // 清空当前列表并重新添加音乐项
    ui->pageMusicList->clear();
    addMusicToMusicPage(music_list);
    // 遍历页面音乐ID，为每个音乐创建列表项并设置相关信息
    for (auto &music_id : music_of_page_)
    {
        // 根据音乐ID查找音乐信息
        auto it = music_list.findMusicByMusicId(music_id);
        if (it == music_list.end())
            continue;
        // 将music的歌曲名称、作者、专辑名称更新到界面
        // 创建列表项控件并设置音乐信息
        listItemBox *list_item_box = new listItemBox(this);
        list_item_box->setMusicName(it->getMusicName());
        list_item_box->setMusicSinger(it->getMusicSinger());
        list_item_box->setMusicAlbum(it->getMusicAlbum());
        list_item_box->setMusicLike(it->getIsLike());

        // 创建一个新的QListWidgetItem对象，并将其添加到ui->pageMusicList控件中
        QListWidgetItem *item = new QListWidgetItem(ui->pageMusicList);
        // 设置项的大小提示，使用list_item_box控件的宽度和高度
        item->setSizeHint(QSize(list_item_box->width(), list_item_box->height()));
        // 将list_item_box控件设置为item的控件项
        ui->pageMusicList->setItemWidget(item, list_item_box);

        // 连接信号槽，处理音乐喜欢状态的更新
        connect(list_item_box, &listItemBox::setIsLike, this, [=](bool is_like) {
            emit updateLikeMusic(is_like, it->getMusicId());
        });
    }

    // 触发窗口重绘paintEvent
    // update(); // update()将paintEvent事件放在事件循环队列中，没有立马处理
    repaint(); // 立马响应paintEvent
}
/**
 * @brief 将音乐添加到播放器播放列表
 * @param music_list 音乐列表引用
 * @param play_list 媒体播放列表指针
 * @details 该函数将音乐列表中的音乐根据页面类型添加到指定的播放列表中：
 *          - LOCAL_PAGE: 添加所有音乐
 *          - LIKE_PAGE: 只添加标记为喜欢的音乐
 *          - HISTORY_PAGE: 只添加历史播放过的音乐
 * @note 此函数是const成员函数，不会修改对象状态
 */
void commonPage::addMusicToPlayer(musicList &music_list, QMediaPlaylist *play_list) const
{
    // 遍历音乐列表，根据页面类型添加音乐到播放列表
    for (auto &music : music_list)
    {
        switch (page_typy_)
        {
        case LOCAL_PAGE:
            // 本地页面添加所有音乐到播放列表
            play_list->addMedia(music.getMusicUrl());
            break;
        case LIKE_PAGE:
            // 喜欢页面只添加标记为喜欢的音乐到播放列表
            if (music.getIsLike())
                play_list->addMedia(music.getMusicUrl());
            break;
        case HISTORY_PAGE:
            // 历史页面只添加历史播放过的音乐到播放列表
            if (music.getIsHistory())
                play_list->addMedia(music.getMusicUrl());
            break;
        default:
            break;
        }
    }
}
/**
 * @brief 根据索引获取音乐ID
 * @param index 音乐在列表中的索引
 * @return const QString& 返回对应索引的音乐ID引用
 * @details 该函数根据提供的索引返回对应音乐的唯一标识符。
 *          如果索引超出范围，则返回空字符串引用。
 * @note 返回的是引用类型，使用静态空字符串确保引用始终有效
 */
const QString &commonPage::getMusicIdByIndex(const int index) const
{
    static const QString empty_string = ""; // 静态空字符串，确保引用始终有效
    // 检查索引是否超出范围
    if (index >= music_of_page_.size())
    {
        Debug << "无此歌曲";
        return empty_string; // 静态空字符串，确保引用始终有效;
    }
    // 返回指定索引的音乐ID
    return music_of_page_[index];
}
/**
 * @brief 设置音乐图片
 * @param pixmap 图片像素图对象
 * @details 该函数用于设置页面上显示的音乐相关图片，
 *          通常用于显示专辑封面或相关图像。
 *          设置图片后会启用内容缩放以适应显示区域。
 * @note 此函数是const成员函数，不会修改对象状态
 */
void commonPage::setMusicImage(const QPixmap &pixmap) const
{
    // 设置页面音乐图片并启用内容缩放
    ui->musicImageLabel->setPixmap(pixmap);
    ui->musicImageLabel->setScaledContents(true);
}
commonPage::~commonPage()
{
    delete ui;
}